﻿using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using PortaCapena.OdooJsonRpcClient.Attributes;
using PortaCapena.OdooJsonRpcClient.Converters;
using PortaCapena.OdooJsonRpcClient.Models;
using System;
using System.ComponentModel;
using System.Runtime.Serialization;
using static OdooRpcClient.OdooEnum;
namespace OdooRpcClient.Model.Base
{
    [OdooTableName("ir.model.fields")]
    [JsonConverter(typeof(OdooModelConverter))]
    public class IrModelFieldsOdooModel : IOdooModel
    {

        /// <summary>
        /// 字段名称  
        /// 字段类型	字符
        /// 必须的
        /// <summary>
        [JsonProperty("name")]
        [Description("字段名称")]
        public string Name { get; set; }

        /// <summary>
        /// 完整名称  
        /// 字段类型	字符
        /// <summary>
        [JsonProperty("complete_name")]
        [Description("完整名称")]
        public string CompleteName { get; set; }

        /// <summary>
        /// 模型名称  
        /// 字段类型	字符	
        /// 字段帮助	该字段所属模块名称 
        /// 必须的
        /// <summary>
        [JsonProperty("model")]
        [Description("模型名称")]
        public string Model { get; set; }

        /// <summary>
        /// 关联的模型  
        /// 字段类型	字符	
        /// 字段帮助	关系字段的目标模型技术名称
        /// <summary>
        [JsonProperty("relation")]
        [Description("Relation")]
        public string Relation { get; set; }

        /// <summary>
        /// 关联字段  
        /// 字段类型	字符	
        /// 字段帮助	对于一对多的字段，此字段在目标模型是实现了相反的多对一关系
        /// <summary>
        [JsonProperty("relation_field")]
        [Description("关联字段")]
        public string RelationField { get; set; }

        /// <summary>
        /// 关系字段  
        /// 字段类型	多对一
        /// 关联的模型	ir.model.fields
        /// <summary>
        [JsonProperty("relation_field_id")]
        [Description("关系字段")]
        public long? RelationFieldId { get; set; }

        /// <summary>
        /// 模型  
        /// 字段类型	多对一	
        /// 字段帮助	该字段所属的模型
        /// 必须的
        /// 关联的模型	ir.model
        /// <summary>
        [JsonProperty("model_id")]
        [Description("模型")]
        public long ModelId { get; set; }

        /// <summary>
        /// 字段标签  
        /// 字段类型	字符
        /// 必须的
        /// <summary>
        [JsonProperty("field_description")]
        [Description("字段标签")]
        public string FieldDescription { get; set; }

        /// <summary>
        /// 字段帮助  
        /// 字段类型	文本
        /// <summary>
        [JsonProperty("help")]
        [Description("字段帮助")]
        public string Help { get; set; }

        /// <summary>
        /// 字段类型  
        /// 字段类型	选择项
        /// 必须的
        /// <summary>
        [JsonProperty("ttype")]
        [Description("字段类型")]
        public FieldTypeIrModelFieldsOdooEnum Ttype { get; set; }

        /// <summary>
        /// 选项选择器(单选)  
        /// 字段类型	字符
        /// <summary>
        [JsonProperty("selection")]
        [Description("选项选择器(单选) ")]
        public string Selection { get; set; }

        /// <summary>
        /// 选择项目  
        /// 字段类型	一对多
        /// 关联的模型	ir.model.fields.selection
        /// 关联字段	field_id
        /// <summary>
        [JsonProperty("selection_ids")]
        [Description("选择项目")]
        public long[] SelectionIds { get; set; }

        /// <summary>
        /// 复制  
        /// 字段类型	布尔型函数	
        /// 字段帮助	值在复制过程中是否拷贝。
        /// <summary>
        [JsonProperty("copied")]
        [Description("Copied")]
        public bool? Copied { get; set; }

        /// <summary>
        /// 关联字段  
        /// 字段类型	字符	
        /// 字段帮助	相应的相关字段（如果有）。这必须是由点分隔的字段名称列表。
        /// <summary>
        [JsonProperty("related")]
        [Description("关联字段")]
        public string Related { get; set; }

        /// <summary>
        /// 关联字段  
        /// 字段类型	多对一
        /// 关联的模型	ir.model.fields
        /// <summary>
        [JsonProperty("related_field_id")]
        [Description("关联字段")]
        public long? RelatedFieldId { get; set; }

        /// <summary>
        /// 必须的  
        /// 字段类型	布尔型函数
        /// <summary>
        [JsonProperty("required")]
        [Description("Required")]
        public bool? Required { get; set; }

        /// <summary>
        /// 只读  
        /// 字段类型	布尔型函数
        /// <summary>
        [JsonProperty("readonly")]
        [Description("只读")]
        public bool? Readonly { get; set; }

        /// <summary>
        /// 索引  
        /// 字段类型	布尔型函数
        /// <summary>
        [JsonProperty("index")]
        [Description("索引")]
        public bool? Index { get; set; }

        /// <summary>
        /// 可翻译  
        /// 字段类型	布尔型函数	
        /// 字段帮助	是否可以转换此字段的值（启用该字段的转换机制）
        /// <summary>
        [JsonProperty("translate")]
        [Description("可翻译")]
        public bool? Translate { get; set; }

        /// <summary>
        /// 大小  
        /// 字段类型	整数
        /// <summary>
        [JsonProperty("size")]
        [Description("大小")]
        public int? Size { get; set; }

        /// <summary>
        /// 类型  
        /// 字段类型	选择项
        /// <summary>
        [JsonProperty("state")]
        [Description("类型")]
        public TypeIrModelFieldsOdooEnum State { get; set; }

        /// <summary>
        /// 在删除时  
        /// 字段类型	选择项	
        /// 字段帮助	多对一（many2one）字段的 on delete 属性
        /// <summary>
        [JsonProperty("on_delete")]
        [Description("在删除时")]
        public OnDeleteIrModelFieldsOdooEnum? OnDelete { get; set; }

        /// <summary>
        /// 域(过滤)  
        /// 字段类型	字符	
        /// 字段帮助	过滤条件这个字段是可选输入的，用于在输入关系型字段时限制可选值的范围。
        ///             格式为一个python列表，每个列表项由三个字符组成。.例如: [('color','=','red')]
        /// <summary>
        [JsonProperty("domain")]
        [Description("域(过滤) ")]
        public string Domain { get; set; }

        /// <summary>
        /// 群组  
        /// 字段类型	多对多
        /// 关联的模型	res.groups
        /// <summary>
        [JsonProperty("groups")]
        [Description("群组")]
        public long[] Groups { get; set; }

        /// <summary>
        /// 扩展分组  
        /// 字段类型	布尔型函数	
        /// 字段帮助	如果选中，目标模型的所有记录都将包括在内
        ///             分组结果（例如"分组"筛选器、看板列等）。
        ///             请注意，如果目标模型字段包含大量记录，将会明显降低性能；通常用于少有记录的模型
        ///             （如阶段、职位、事件类型等）。
        /// <summary>
        [JsonProperty("group_expand")]
        [Description("扩展分组")]
        public bool? GroupExpand { get; set; }

        /// <summary>
        ///	可选  
        ///	字段类型	布尔型函数
        /// <summary>
        [JsonProperty("selectable")]
        [Description("可选")]
        public bool? Selectable { get; set; }

        /// <summary>
        /// 应用内  
        /// 字段类型	字符	
        /// 字段帮助	该字段被定义的模块列表
        /// <summary>
        [JsonProperty("modules")]
        [Description("应用内")]
        public string Modules { get; set; }

        /// <summary>
        /// 关系表  
        /// 字段类型	字符	
        /// 字段帮助	用于自定义多对多字段，以定义自定义的关系表名称
        /// <summary>
        [JsonProperty("relation_table")]
        [Description("关系表")]
        public string RelationTable { get; set; }

        /// <summary>
        /// 列 1
        /// 字段类型	字符	
        /// 字段帮助	栏位指向在model表中的记录
        /// <summary>
        [JsonProperty("column1")]
        [Description("列 1")]
        public string Column1 { get; set; }

        /// <summary>
        /// 列 2
        /// 字段类型	字符	
        /// 字段帮助	栏位指向在comodel表中的记录
        /// <summary>
        [JsonProperty("column2")]
        [Description("列 2")]
        public string Column2 { get; set; }

        /// <summary>
        /// 计算  
        /// 字段类型	文本	
        /// 字段帮助	用于计算字段值的代码。
        ///                 在记录集“self”中迭代并分配字段的值：
        ///                 for record in selffor record in self:
        ///                 record['size'] = len(record.name)
        ///                 模块时间、日期时间、dateutil 可用。
       /// <summary>
       [JsonProperty("compute")]
       [Description("计算")]
       public string Compute { get; set; }

        /// <summary>
        /// 依赖  
        /// 字段类型	字符	
        /// 字段帮助	计算方法的相关性；一列以逗号分隔的字段名称，例如
        ///                 name, partner_id.name
       /// <summary>
       [JsonProperty("depends")]
       [Description("依赖")]
       public string Depends { get; set; }

        /// <summary>
        /// 存储  
        /// 字段类型	布尔型函数	
        /// 字段帮助	值是否存储在数据库。
        /// <summary>
        [JsonProperty("store")]
        [Description("存储")]
        public bool? Store { get; set; }

        /// <summary>
        /// 启用跟踪命令  
        /// 字段类型	整数	字
        /// 段帮助	设置对该字段所做的每个修改都在聊天框被跟踪。值被用于排序跟踪值。
        /// <summary>
        [JsonProperty("tracking")]
        [Description("启用跟踪命令")]
        public int? Tracking { get; set; }

        /// <summary>
        /// ID  
        /// 字段类型	整数
        /// <summary>
        [JsonProperty("id")]
        [Description("Id")]
        public long Id { get; set; }

        /// <summary>
        /// 显示名称  
        /// 字段类型	字符
        /// <summary>
        [JsonProperty("display_name")]
        [Description("显示名称")]
        public string DisplayName { get; set; }

        /// <summary>
        /// 创建者  
        /// 字段类型	多对一
        /// 关联的模型	res.users
        /// <summary>
        [JsonProperty("create_uid")]
        [Description("创建者")]
        public long? CreateUid { get; set; }

        /// <summary>
        /// 创建时间  
        /// 字段类型	日期时间
        /// 关联的模型	res.users
        /// <summary>
        [JsonProperty("create_date")]
        [Description("创建时间")]
        public DateTime? CreateDate { get; set; }

        /// <summary>
        /// 创建者  
        /// 字段类型	多对一
        /// <summary>
        [JsonProperty("write_uid")]
        [Description("创建者")]
        public long? WriteUid { get; set; }

        /// <summary>
        /// 更新时间  
        /// 字段类型	日期时间
        /// <summary>
        [JsonProperty("更新时间")]
        [Description("WriteDate")]
        public DateTime? WriteDate { get; set; }

        /// <summary>
        /// 最后更改日
        /// 字段类型	日期时间
        /// <summary>
        [JsonProperty("__last_update")]
        [Description("最后更改日")]
        public DateTime? LastUpdate { get; set; }
    }


    [JsonConverter(typeof(StringEnumConverter))]
    public enum FieldTypeIrModelFieldsOdooEnum
    {
        /// <summary>
        /// 二进制
        /// </summary>
        [EnumMember(Value = "binary")]
        Binary = 1,

        /// <summary>
        /// 布尔型函数
        /// </summary>
        [EnumMember(Value = "boolean")]
        Boolean = 2,

        /// <summary>
        /// 字符
        /// </summary>
        [EnumMember(Value = "char")]
        Char = 3,

        /// <summary>
        /// 日期
        /// </summary>
        [EnumMember(Value = "date")]
        Date = 4,

        /// <summary>
        /// 日期时间
        /// </summary>
        [EnumMember(Value = "datetime")]
        Datetime = 5,

        /// <summary>
        /// 浮点型
        /// </summary>
        [EnumMember(Value = "float")]
        Float = 6,

        /// <summary>
        /// html
        /// </summary>
        [EnumMember(Value = "html")]
        Html = 7,

        /// <summary>
        /// 整数
        /// </summary>
        [EnumMember(Value = "integer")]
        Integer = 8,

        /// <summary>
        /// 多对多
        /// </summary>
        [EnumMember(Value = "many2many")]
        Many2many = 9,

        /// <summary>
        /// 多对一
        /// </summary>
        [EnumMember(Value = "many2one")]
        Many2one = 10,

        /// <summary>
        /// 多对一参考 
        /// </summary>
        [EnumMember(Value = "many2one_reference")]
        Many2oneReference = 11,

        /// <summary>
        /// 货币
        /// </summary>
        [EnumMember(Value = "monetary")]
        Monetary = 12,

        /// <summary>
        /// 一对多
        /// </summary>
        [EnumMember(Value = "one2many")]
        One2many = 13,

        /// <summary>
        /// 参考
        /// </summary>
        [EnumMember(Value = "reference")]
        Reference = 14,

        /// <summary>
        /// 选择项
        /// </summary>
        [EnumMember(Value = "selection")]
        Selection = 15,

        /// <summary>
        /// 文本
        /// </summary>
        [EnumMember(Value = "text")]
        Text = 16,
    }


    [JsonConverter(typeof(StringEnumConverter))]
    public enum TypeIrModelFieldsOdooEnum
    {
        /// <summary>
        /// 自定义字段
        /// </summary>
        [EnumMember(Value = "manual")]
        CustomField = 1,

        /// <summary>
        /// 基础字段
        /// </summary>
        [EnumMember(Value = "base")]
        BaseField = 2,
    }


    // On delete property for many2one fields
    [JsonConverter(typeof(StringEnumConverter))]
    public enum OnDeleteIrModelFieldsOdooEnum
    {
        /// <summary>
        /// 级联
        /// </summary>
        [EnumMember(Value = "cascade")]
        Cascade = 1,

        /// <summary>
        /// 设置为空
        /// </summary>
        [EnumMember(Value = "set null")]
        SetNULL = 2,

        /// <summary>
        /// 限制
        /// </summary>
        [EnumMember(Value = "restrict")]
        Restrict = 3,
    }

}
